home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 2
/
Atari Mega Archive CD - Volume 2.iso
/
8bit
/
cislib_b
/
rmdsk2.asm
< prev
next >
Wrap
Assembly Source File
|
1995-04-22
|
11KB
|
457 lines
.TAB 11,15,27
.SET 1,7
.TITLE "RAMDISK FOR FMS VERSION 2 05-25-85"
;
********* ZERO PAGE **********
;
RTCLKL = $14
BUFRL = $32 ;SIO ZPG, CAN USE
BFENL = $34 ;SIO ZPG, CAN USE
;
******** OTHER RAM ***********
;
INITAD = $02E2
DVSTAT = $02EA
DRVBYT = $070A ;DRIVE BITS
SASA = $070C ;END FMS CODE
DSIO4 = $07A2 ;FMS 2 SIO CALL
FMSINIT = $07E0
DIHCL = $0816 ;FMS 2 NORM STAT CALL
WRTDOS = $120A ;FMS 2 WRITE DOS ENTRY
ERDVDC = $12BF ;FMS INVALID CMD ERR
TSTLC = $4000 ;EXTRA RAMS
VTOCP = $7200 ;XRAM VTOC
RDIHCL = $E536 ;DOSXL.XL STAT CALL
;
********** OS ROM *************
;
DHADR = $E453 ;OS RES DISK
SIOV = $E459 ;SIO ENTRY ADDR
;
********* CONSTANT ************
;
RAMDRV = 4 ;DRIVE # OF RAMDISK
;
****** I/O REGISTERS **********
;
PORTB = $D301
NMIEN = $D40E
;
;
*********** DCB ***************
;
;
DDEVIC = $0300 ;SERIAL BUS ID
DUNIT = $0301 ;UNIT NUMBER
DCOMND = $0302 ;COMMAND
DSTATS = $0303 ;DIRECTION/STATUS
DBUFLO = $0304 ;BUF ADDR LO
DBUFHI = $0305 ; HI
;
;
DAUX1 = $030A ;DEVICE INFO (SECT LO)
DAUX2 = $030B ; " " ( HI)
;
;
;
;
****** *********
****** RAMDISK HANDLER *********
****** *********
;
*= $3800 ;WILL RELOCATE
;
; SIO CALL TO HERE
;
SECIO LDA DUNIT
CMP #RAMDRV
BEQ SECIO1
JMP SIOV
;
SECIO1 LDA DAUX2 ;HI SECT
CMP #2
BCC TGSEC ;IN RANGE
BNE BDSEC ;RIDICULOUS
LDA DAUX1
CMP #4
BCC TGSEC ;BR IF < 516
;
BDSEC LDY #144
STY DSTATS
RTS
;
TGSEC LDA DAUX2
BNE NRMSC ;BR IF SEC> 255
;
TSCLO LDA DAUX1
CMP #4 ;HI WAS ZERO
BCS NRMSC ;DO TRANS IF 4+
LDY #1
STY DSTATS ;ELSE LIE
RTS
;
NRMSC SEC ;READY TRANSFER
LDA DAUX1 ;SECTOR LO
SBC #4
STA BFENL ;RAMDISK 4 THRU 515
LDA DAUX2
SBC #0
ASL BFENL ;EXTRA RAM PG UPPER
ROL A ;2 BITS
ASL A
ASL A
STA BFENL+1 ;AT BITS 2 AND 3
LDX RTCLKL
WVLP CPX RTCLKL
BEQ WVLP ;WAIT 'TIL END VBLANK
LDA #0
STA NMIEN ;TURN OFF NMI
SEI ; AND IRQ
LDA PORTB ;MEM CONTROL
TAX ;NORM IN X
AND #$E3
ORA BFENL+1
PHA ;RMDSK ON STACK
LDA BFENL ;SECT # REMAINDER
SEC ;+ $40 (WILL BE)
ROR A
LSR A ;LSB TO C
STA BFENL+1 ;IS HIGH ADDR
LDA #0
ROR A ;SECT LSB = 128 BYTES
STA BFENL
LDA DBUFLO
STA BUFRL ;SET I/O ADDRESS
LDA DBUFHI
STA BUFRL+1
LDY #127
LDA DSTATS
BMI SCWRT ;BR IF 'TO DISK'
SECRD PLA ;ELSE
PHA
STA PORTB ;RMDSK
LDA (BFENL),Y ;IS SOURCE
STX PORTB ;NORM
STA (BUFRL),Y ;IS DEST
DEY
BPL SECRD
BMI SCDON
;
SCWRT PLA ;FOR WRITE,
STX PORTB
TAX ;SWAP SO THAT
LDA PORTB
PHA
SCWT1 PLA
PHA
STA PORTB ;NORM
LDA (BUFRL),Y ;IS SOURCE
STX PORTB ;RMDSK
STA (BFENL),Y ;IS DEST
DEY
BPL SCWT1
;
TXA
AND #$0C
CMP #8 ;VTOC BANK?
BNE SCDON ;BR NO
LDX #1
CPX VTOCP+2 ;TEST MAXSEC HI
BEQ SCDON ;ASSUME OK
LDA VTOCP+3
SBC #707-504 ;ALSO BORROW
BCS SCWT2
DEC VTOCP+4
BPL SCWT2
LDA #0
STA VTOCP+4
SCWT2 STA VTOCP+3 ;FREE SECTS
STX VTOCP+2
LDA #$F7
STA VTOCP+1 ;& MAX SECTS
;
SCDON PLA ;FIX STACK
LDA PORTB
AND #$E3
ORA #$1C
STA PORTB ;NORM
LDA #$C0
STA NMIEN ;ENABLE NMI
CLI ; AND IRQ
LDA #0
LDY #1
STY DSTATS ;AFFIRM GOOD
RTS
;
SCIOLN = *-SECIO
;
********* DRIVE STATUS ********
;
DRSTAT LDA DUNIT
CMP #RAMDRV
BEQ RMSTA
JMP DHADR
;
RMSTA LDA #0
STA DVSTAT
STA DVSTAT+1
STA DVSTAT+3
LDY #1
STY DVSTAT+2 ;128 BYTE SECTS
RTS
;
RELEN = *-SECIO ;RELOCATE LENGTH
;
;
;
***** *****
***** INSTALLATION ROUTINE *****
***** *****
;
INSTALL LDA DSIO4+1 ;SIO CALL?
CMP # <SIOV
BNE NOPE
LDA DSIO4+2
CMP # >SIOV
BNE NOPE
;
******* 130XE TEST *********
;
LDA PORTB
TAX ;SAVE NORM CONFIG
AND #$EF
TAY ;SAVE EXTRA CONFIG
STY PORTB
LDA TSTLC ;GET EXTRA BYTE
STX PORTB ;SET NORM
CMP TSTLC
BNE CNTIN ;BR IF EXTRA
LDA TSTLC
EOR #$FF ;COMPLEMENT NORM
STA TSTLC
STY PORTB ;SET EXTRA
CMP TSTLC
PHP ;SAVE COMPARE RESULT
STX PORTB
EOR #$FF ;UNCOMPLEMENT
STA TSTLC ;& REPAIR NORM
PLP
BNE CNTIN ;BR IF EXTRA
NOPE JMP NONE
;
CNTIN LDA DIHCL+1 ;NORM V2 STAT CALL?
CMP # <DHADR
BNE NOTLO
LDA DIHCL+2
CMP # >DHADR
BEQ DS2LO ;IF SO, CAN INSTALL
;
NOTLO LDA #0 ;ELSE DOSXL.XL STAT CALL?
LDX RTCLKL
IVBLP CPX RTCLKL
BEQ IVBLP
STA NMIEN
SEI
LDA PORTB
AND #$FE
STA PORTB
LDA RDIHCL+1
CMP # <DHADR
BNE NOTFN
LDA RDIHCL+2
CMP # >DHADR
BNE NOTFN
JSR COPYDOWN ;YES...DO MOVE
LDA DRSADR ;& REPLACE STAT CALL
STA RDIHCL+1
LDA DRSADR+1
STA RDIHCL+2
LDA PORTB
ORA #1
STA PORTB
LDA #$C0
STA NMIEN
CLI
JMP D2HAV
;
NOTFN LDA PORTB ;NO, JUST BACK TO OS
ORA #1
STA PORTB
LDA #$C0
STA NMIEN
CLI ;INTS ENABLED
NONE RTS ;AND OUT
;
DS2LO JSR COPYDOWN ;LO FOUND
LDA DRSADR
STA DIHCL+1 ;REPLACE STAT CALL
LDA DRSADR+1
STA DIHCL+2
LDA #$4C ;JMP INSTRUCTION
STA WRTDOS
LDA # <ERDVDC ;TO INVALID CMD
STA WRTDOS+1
LDA # >ERDVDC ;DISABLES DOS WRITE
STA WRTDOS+2
;
D2HAV CLC ;EITHER,
LDA SASA
ADC # <RELEN ;ADD INSTALLED LENGTH
STA SASA ;TO END FMS VALUE
LDA SASA+1
ADC # >RELEN
STA SASA+1
JSR FMSINIT ;& REINIT FMS
;
******* FORMAT 'DISK' ********
;
LDX RTCLKL
FMT CPX RTCLKL
BEQ FMT ;WAIT VBL
LDA #0
STA NMIEN
SEI ;DISABLE INTS
LDA PORTB
AND #$E3
PHA
ORA #8
STA PORTB ;VTOC BANK
LDX #0
LDA $7200 ;1ST VTOC BYTE
CMP #2
BEQ VTST2
INX
VTST2 LDA $7201 ;2ND
CMP #$F7
BEQ VTST3
INX
VTST3 LDA $7202 ;3RD
CMP #1
BEQ VTSTN
INX
VTSTN PLA
CPX #0
BEQ FMTDN ;OUT, PREVIOUSLY DONE
FLP1 STA PORTB
LDA #$40
STA BUFRL+1
TAX
LDA #0
STA BUFRL
TAY
FLP2 STA (BUFRL),Y ;CLEAR ALL DISK
INY
BNE FLP2
INC BUFRL+1
DEX
BNE FLP2
CLC
LDA PORTB
ADC #4
PHA
AND #$0C
BEQ FCDON